package com.zmp.kotlinnote.exchange
open class D {
}

class D1 : D() {
}

open class C {

    open fun D.foo() {
        println("D.foo in C ---> class:${this::class.java.simpleName}")
    }

    open fun D1.foo() {
        println("D1.foo in C ---> class:${this::class.java.simpleName}")
    }

    fun caller(d: D) {
        d.foo()   // 调用扩展函数
    }
}

class C1 : C() {
    override fun D.foo() {
        println("D.foo in C1 ---> class:${this::class.java.simpleName}")
    }

    override fun D1.foo() {
        println("D1.foo in C1 ---> class:${this::class.java.simpleName}")
    }
}


open class C3 {

    open fun foo(d: D) {
        println("D.foo in C3 ---> class:${d::class.java.simpleName}")
    }

    open fun foo(d1:D1) {
        println("D1.foo in C3 ---> class:${d1::class.java.simpleName}")
    }

    fun caller(d: D) {
        foo(d)   // 调用扩展函数
    }
}

class C4 : C3() {

    override fun foo(d: D) {
        println("D.foo in C4 ---> class:${d::class.java.simpleName}")
    }

    override fun foo(d1:D1) {
        println("D1.foo in C4 ---> class:${d1::class.java.simpleName}")
    }
}